package GUI;

import java.util.*;

import DTO.*;
import DAL.*;

/**
 * Classe que tem por função relacionar os itens gráficos do jogo.
 *
 * @author (R. Soares)
 * @version (1.0 - 24.05.2010)
 */
public class JogoGUI
{
    // Variáveis de Instância --------------------------------------------------*

    // Objetos presentes na área de jogo
    private ObjetoGUI _planoFundoGUI;
    private ObjetoGUI _planetaGUI;
    private ObjetoGUI _sateliteGUI;
    private ArrayList _meteorosGUI;
    private ArrayList _misseisGUI;
    private TextoGUI _escoreGUI;
    private TextoGUI _faseGUI;
    private TextoGUI _chancesGUI;
    private ArquivoImagemDAL arquivosImagem;

    // Contrutores -------------------------------------------------------------- *
    /**
     * Construtor da classe JogoGUI
     */
    public JogoGUI()
    {
        _meteorosGUI = new ArrayList();
        _misseisGUI = new ArrayList();
        arquivosImagem = new ArquivoImagemDAL();
    }

    // Métodos ---------------------------------------------------------------------*

    /**
     * Método que desenha a imagem de fundo da área de jogo
     *
     * @param  int - largura : largura da imagem
     * @param  int - altura : altura da imagem
     */
    public void desenharFundo(int altura, int largura)
    {
        double coordenadaX = largura;
        double coordenadaY = altura;

        _planoFundoGUI = new ObjetoGUI( altura, largura,
                                                                arquivosImagem.getImagemFundo(),
                                                                                        coordenadaX, coordenadaY );
        _planoFundoGUI.tornaVisivel();
    }

    /**
     * Método que gera o texto de escore na área de jogo
     *
     * @param  double - cX : Coordenada X do centro da tela
     * @param  int - tamanho : Tamanho do texto
     * @param  int - escore : Valor inicial do escore
     */
    public void desenharEscore(double cX, int tamanho, int escore)
    {
        String escoreString = escore + "";
        int coordenadaX = new Double(cX * 2).intValue() -
                                                                    (28 + (escoreString.length() * 10) );
        int coordenadaY = 30;

        _escoreGUI = new TextoGUI(escoreString, tamanho, coordenadaX, coordenadaY );
        _escoreGUI.tornaVisivel();
    }

    /**
     * Método que gera o texto de escore na área de jogo
     *
     * @param  int - tamanho : Tamanho do texto
     * @param  int - fase : Valor da fase
     */
    public void desenharFase(int tamanho, int fase)
    {
        int coordenadaX =  30;
        int coordenadaY =  30;

        _faseGUI = new TextoGUI("FASE " +  fase, tamanho, coordenadaX,
                                                                                                       coordenadaY );
        _faseGUI.tornaVisivel();
    }

    /**
     * Método que gera o texto de escore na área de jogo
     *
     * @param  double - cY : Coordenada Y do centro da tela
     * @param  int - tamanho : Tamanho do texto
     * @param  int - texto : Valor do escore
     */
    public void desenharChances(double cY, int tamanho, int chances)
    {
        int coordenadaX = 30;
        int coordenadaY = new Double( cY * 2).intValue() - 20;

        _chancesGUI = new TextoGUI("Chances : " + chances, tamanho, coordenadaX,
                                                                                                              coordenadaY );
        _chancesGUI.tornaVisivel();
    }

    /**
     * Método que gera a imagem de um satélite na área de jogo
     *
     * @param  Ponto - posicao : Coordenada de posicao do satélite
     * @param  int - diametro : Diametro do satélite
     */
    public void desenharSatelite(Ponto posicao, int diametro)
    {
        double coordenadaX = posicao.getCoordenadaX();
        double coordenadaY = posicao.getCoordenadaY();

        _sateliteGUI = new ObjetoGUI( diametro, arquivosImagem.getImagemSatelite(),
                                                   coordenadaX, coordenadaY );
        _sateliteGUI.tornaVisivel();
    }

    /**
     * Método que gera a imagem de um planeta e o posiciona na área de jogo
     *
     * @param  Ponto - posicao : Coordenada de posicao do planeta
     * @param  int - diametro : Diametro do planeta
     */
    public void desenharPlaneta(Ponto posicao, int diametro)
    {
        double coordenadaX = posicao.getCoordenadaX();
        double coordenadaY = posicao.getCoordenadaY();

        _planetaGUI = new ObjetoGUI( diametro, arquivosImagem.getImagemPlaneta(),
                                                    coordenadaX, coordenadaY );
        _planetaGUI.tornaVisivel();
    }

    /**
     * Método que gera a imagem de um meteoro e o posiciona na área de jogo
     *
     * @param  Ponto - posicao : Coordenada de posicao inicial do meteoro
     * @return  Circulo : Objeto da imagem do meteoro criada
     */
    public void desenharMeteoro(Ponto posicao, int diametro)
    {
        ObjetoGUI meteoro = new ObjetoGUI(diametro, arquivosImagem.getImagemMeteoro(), posicao.getCoordenadaX(), posicao.getCoordenadaY() );
        meteoro.tornaVisivel();

        _meteorosGUI.add(meteoro);
    }

    /**
     * Método que gera a imagem de um missil e o posiciona na área de jogo
     *
     * @param  Ponto - posicao : Coordenada de posicao inicial do meteoro
     * @return  Circulo : Objeto da imagem do meteoro criada
     */
    public void desenharMissil(Ponto posicao, int diametro)
    {
        ObjetoGUI missil = new ObjetoGUI(diametro, arquivosImagem.getImagemMissil(),
                                                     posicao.getCoordenadaX(),
                                                     posicao.getCoordenadaY() );
        missil.tornaVisivel();

        _misseisGUI.add(missil);
    }

    /**
     * Método que move um meteoro trocando sua posicao
     *
     * @param  int - chave : Chave de identificação da imagem de meteoro
     * @param  Ponto - posicao : Coordenada da nova posicao do meteoro
     */
    public void moverMeteoro(int chave, Ponto posicao)
    {
        ObjetoGUI meteoroGUI = (ObjetoGUI) _meteorosGUI.get(chave);
        meteoroGUI.move( posicao.getCoordenadaX(),
                                      posicao.getCoordenadaY() );
    }

    /**
     * Método que move um missil trocando sua posicao
     *
     * @param  int - chave : Chave de identificação da imagem de missil
     * @param  Ponto - posicao : Coordenada da nova posicao do missil
     */
    public void moverMissil(int chave, Ponto posicao)
    {
        ObjetoGUI missilGUI = (ObjetoGUI) _misseisGUI.get(chave);
        missilGUI.move( posicao.getCoordenadaX(),
                                  posicao.getCoordenadaY() );
    }

    /**
     * Método que move o satélite trocando sua posição
     *
     * @param  Ponto - posicao : Coordenada da nova posicao do satélite
     */
    public void moverSatelite(Ponto posicao, double angulo)
    {
        _sateliteGUI.moveCircular( posicao.getCoordenadaX(),
                                                   posicao.getCoordenadaY(),
                                                   angulo);
    }

    /**
     * Método que atualiza o texto do escore
     *
     * @param  int - escore : novo escore
     */
    public void atualizarEscore(int escore)
    {
        _escoreGUI.atualizarTexto(escore + "");
    }

    /**
     * Método que atualiza o texto do fase
     *
     * @param  int - texto : nova fase
     */
    public void atualizarFase(int fase)
    {
        _faseGUI.atualizarTexto("FASE " + fase);
    }

    /**
     * Método que atualiza o texto dos chances
     *
     * @param  int - texto : novo valor de chances
     */
    public void atualizarChances(int chances)
    {
        _chancesGUI.atualizarTexto("Chances : " + chances);
    }


    /**
     * Método que remove a imagem de um missil da área de jogo
     *
     * @param  int - chave : Chave de identificação da imagem do missil
     */
    public void removerMissil(int chave)
    {
        ObjetoGUI missilGUI = (ObjetoGUI) _misseisGUI.get(chave);
        missilGUI.tornaInvisivel();
        _misseisGUI.remove(chave);
    }

    /**
     * Método que remove a imagem de um meteoro da área de jogo
     *
     * @param  int - chave : Chave de identificação da imagem do meteoro
     */
    public void removerMeteoro(int chave)
    {
        ObjetoGUI meteoroGUI = (ObjetoGUI) _meteorosGUI.get(chave);
        meteoroGUI.tornaInvisivel();
    }

    /**
     * Método que limpa a lista de imagens de meteoros
     */
    public void limpaListaMeteoro()
    {
        _meteorosGUI.clear();
    }

    /**
     * Método que limpa a lista de imagens de misseis
     */
    public void limpaListaMisseis()
    {
        _misseisGUI.clear();
    }
}
